使用动画节点
在游戏开发中,动画是使角色和场景生动起来的重要元素。Dora SSR 引擎提供了一个强大的动画处理节点类——Playable。它是三种动画系统的基础类:
- Model:
- Dora SSR 引擎实现的骨骼动画系统。
- 动画模型通常由一个
.model
文件,一个.clip
文件和一个.png
文件组成。
- DragonBone:
- 开源的 DragonBones 动画系统。
- 动画模型通常由一个以
_ske.json
结尾的文件,一个以_tex.json
结尾的文件和一个以_tex.png
结尾的图片文件组成。
- Spine:
- 著名的商业动画软件 Spine2D 的动画系统。
- 动画模型通常由一个
.json
(或是.skel
) 文件,一个.atlas
文件和一个.png
文件组成。
本教程将指导您如何在程序中使用 Playable 节点,涵盖从加载动画到控制播放的各个方面。
1. 创建 Playable 实例
要使用 Playable 节点,首先需要创建其实例。Playable 支持三种动画系统,通常使用的加载方式如下:
- Model 文件:
"model:"
前缀 + 不带后缀的模型文件路径。 - Spine 文件:
"spine:"
前缀 + 不带后缀的 Spine 文件路径。 - DragonBones 文件:
"bone:"
前缀 + 不带后缀的 DragonBones 文件路径。
1.1 示例:加载 Model 动画
- Lua
- Teal
- TypeScript
- YueScript
local Playable <const> = require("Playable")
-- 加载 Model 动画
local modelPath = "model:assets/character"
local character = Playable(modelPath)
if character then
character.position = Vec2(100, 200)
stage:addChild(character)
else
print("加载 Model 动画失败!")
end
local Playable <const> = require("Playable")
-- 加载 Model 动画
local modelPath = "model:assets/character"
local character = Playable(modelPath)
if not character is nil then
character.position = Vec2(100, 200)
stage:addChild(character)
else
print("加载 Model 动画失败!")
end
import { Playable, Vec2 } from "Dora";
// 加载 Model 动画
const modelPath = "model:assets/character";
const character = Playable(modelPath);
if (character) {
character.position = Vec2(100, 200);
stage.addChild(character);
} else {
print("加载 Model 动画失败!");
}
_ENV = Dora
// 加载 Model 动画
modelPath = "model:assets/character"
character = Playable modelPath
if character
with character
.position = Vec2 100, 200
\addTo stage
else
print "加载 Model 动画失败!"
1.2 示例:加载 Spine 动画
- Lua
- Teal
- TypeScript
- YueScript
local Playable <const> = require("Playable")
-- 加载 Spine 动画
local spinePath = "spine:assets/monster"
local monster = Playable(spinePath)
if monster then
monster.position = Vec2(300, 200)
stage:addChild(monster)
else
print("加载 Spine 动画失败!")
end
local Playable <const> = require("Playable")
-- 加载 Spine 动画
local spinePath = "spine:assets/monster"
local monster = Playable(spinePath)
if not monster is nil then
monster.position = Vec2(300, 200)
stage:addChild(monster)
else
print("加载 Spine 动画失败!")
end
import { Playable, Vec2 } from "Dora";
// 加载 Spine 动画
const spinePath = "spine:assets/monster";
const monster = Playable(spinePath);
if (monster) {
monster.position = Vec2(300, 200);
stage.addChild(monster);
} else {
print("加载 Spine 动画失败!");
}
_ENV = Dora
// 加载 Spine 动画
spinePath = "spine:assets/monster"
monster = Playable spinePath
if monster
with monster
.position = Vec2 300, 200
\addTo stage
else
print "加载 Spine 动画失败!"
1.3 示例:加载 DragonBones 动画
- Lua
- Teal
- TypeScript
- YueScript
local Playable <const> = require("Playable")
-- 加载 DragonBones 动画
local dragonBonePath = "bone:assets/dragon"
local dragon = Playable(dragonBonePath)
if dragon then
dragon.position = Vec2(500, 200)
stage:addChild(dragon)
else
print("加载 DragonBones 动画失败!")
end
local Playable <const> = require("Playable")
-- 加载 DragonBones 动画
local dragonBonePath = "bone:assets/dragon"
local dragon = Playable(dragonBonePath)
if not dragon is nil then
dragon.position = Vec2(500, 200)
stage:addChild(dragon)
else
print("加载 DragonBones 动画失败!")
end
import { Playable, Vec2 } from "Dora";
// 加载 DragonBones 动画
const dragonBonePath = "bone:assets/dragon";
const dragon = Playable(dragonBonePath);
if (dragon) {
dragon.position = Vec2(500, 200);
stage.addChild(dragon);
} else {
print("加载 DragonBones 动画失败!");
}
_ENV = Dora
// 加载 DragonBones 动画
dragonBonePath = "bone:assets/dragon"
dragon = Playable dragonBonePath
if dragon
with dragon
.position = Vec2 500, 200
\addTo stage
else
print "加载 DragonBones 动画失败!"
1.4 示例:异步加载动画
在实际开发中,加载动画可能需要一些时间。您可以使用 Cache:loadAsync()
方法异步加载动画,加载完成后执行回调函数。
- Lua
- Teal
- TypeScript
- YueScript
local Playable <const> = require("Playable")
local thread <const> = require("thread")
-- 异步加载 Model 动画
local modelPath = "model:assets/character"
thread(function()
if Cache:loadAsync(modelPath) then
local character = Playable(modelPath)
character.position = Vec2(100, 200)
stage:addChild(character)
else
print("异步加载 Model 动画失败!")
end
end)
local Playable <const> = require("Playable")
local thread <const> = require("thread")
-- 异步加载 Model 动画
local modelPath = "model:assets/character"
thread(function()
if Cache:loadAsync(modelPath) then
local character = Playable(modelPath)
if not character is nil then
character.position = Vec2(100, 200)
stage:addChild(character)
end
else
print("异步加载 Model 动画失败!")
end
end)
import { Playable, Vec2, Cache, thread } from "Dora";
// 异步加载 Model 动画
const modelPath = "model:assets/character";
thread(() => {
if (Cache.loadAsync(modelPath)) {
const character = Playable(modelPath);
if (character) {
character.position = Vec2(100, 200);
stage.addChild(character);
}
} else {
print("异步加载 Model 动画失败!");
}
});
_ENV = Dora
-- 异步加载 Model 动画
modelPath = "model:assets/character"
thread ->
if Cache\loadAsync modelPath
with Playable modelPath
.position = Vec2 100, 200
\addTo stage
else
print "异步加载 Model 动画失败!"
2. 播放动画
创建实例后,可以使用 play
方法播放指定的动画。
- Lua
- Teal
- TypeScript
- YueScript
-- 播放动画 "run",并循环播放
local duration = character:play("run", true)
-- 播放动画 "run",并循环播放
local duration = character:play("run", true)
// 播放动画 "run",并循环播放
const duration = character.play("run", true);
// 播放动画 "run",并循环播放
duration = character\play "run", true
- 参数说明:
name
:要播放的动画名称。loop
(可选):是否循环播放,默认为false
。
- 返回值:动画的持续时间(秒)。
3. 停止动画
使用 stop
方法可以停止当前正在播放的动画。
- Lua
- Teal
- TypeScript
- YueScript
-- 停止动画
character:stop()
-- 停止动画
character:stop()
// 停止动 画
character.stop();
// 停止动画
character\stop()
4. 设置播放速度
通过调整 speed
属性,可以改变动画的播放速度。
- Lua
- Teal
- TypeScript
- YueScript
-- 将播放速 度加倍
character.speed = 2.0
-- 将播放速度加倍
character.speed = 2.0
// 将播放速度加倍
character.speed = 2.0;
// 将播放速度加倍
character.speed = 2.0
- 注意:
speed
的默认值为1.0
。